package cn.tedu.medicalmanagementsystem.base.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtils {
    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return
     */
    public static String createJWT(String secretKey, Long ttlMillis, Map<String, Object> claims) {
        // 指定签名的时候使用的签名算法，也就是header那部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        // 过期时间=当前时间+间隔时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        // 设置jwt的body
        Date date = new Date(expMillis);
        JwtBuilder jwtBuilder = Jwts.builder()
                // 有效载荷部分
                .setClaims(claims)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, secretKey)
                // 设置过期时间
                .setExpiration(date);
        return jwtBuilder.compact();
    }

    /**
     * 解析jwt
     *
     * @param secretKey jwt秘钥
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        Claims claims = Jwts.parser()
                // 设置签名使用的秘钥
                .setSigningKey(secretKey)
                // 设置需要解析的jwt
                .parseClaimsJws(token)
                .getBody();
        return claims;
    }
}
